/**
 * 开发人员：yhb
 * 时间：2011-7-28 8:22:57
 */
package com.towker.core.util;

import java.beans.PropertyDescriptor;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.sf.json.JSONObject;

import org.apache.commons.beanutils.PropertyUtils;

/**
 * json对象转java对象工具类。
 * @author yanghb
 */
public class JsonUtil
{
	// 将js对象数组转成java对象列表。
	public static <T> List<T> toList(Class<T> clz, String objs)
	{
		// 这个变来将json字符串分割成完好的对象字符子串，之所以采用当前时间的替换与分割办法，是因为
		// 要保证{}是以这些的完整的分割字符串来分割的，而不再有破坏{}的可能。
		String split = "" + TimeUtil.getCurrentTimeValue();
		objs = objs.replace("},{", "}" + split + "{");
		List<T> list = new ArrayList<T>();
		for (String tmp : objs.split(split))
		{
			T obj = toObj(clz, tmp);
			list.add(obj);
		}
		return list;
	}

	// 将js对象转成java对象。
	@SuppressWarnings("unchecked")
	public static <T> T toObj(Class<T> clz, String obj)
	{
		JSONObject json = JSONObject.fromObject(obj);
		return (T) JSONObject.toBean(json, clz);
	}

	/***
	 * 075
	 * 对象转换成为json
	 * 076
	 * 这里是描述这个方法的作用
	 * 077
	 * @return
	 *         078
	 * @author Java
	 *         079
	 * @date 2011-7-22 下午02:59:13
	 *       080
	 */
	public static String objectToJson(Object obj)
	{
		StringBuffer json = new StringBuffer();
		if (obj == null)
		{
			json.append("\"\"");
		}
		else if (obj instanceof Integer)
		{
			json.append("\"").append(numberToJson((Integer) obj)).append("\"");
		}
		else if (obj instanceof Boolean)
		{
			json.append("\"").append(booleanToJson((Boolean) obj)).append("\"");
		}
		else if (obj instanceof String)
		{
			json.append("\"").append(stringToJson(obj.toString())).append("\"");
		}
		else if (obj instanceof Object[])
		{
			json.append("\"").append(arrayToJson((Object[]) obj)).append("\"");
		}
		else if (obj instanceof List)
		{
			json.append("\"").append(listToJson((List<?>) obj)).append("\"");
		}
		else if (obj instanceof Map)
		{
			json.append("\"").append(mapToJson((Map<?, ?>) obj)).append("\"");
		}
		else if (obj instanceof java.sql.Date)
		{
			json.append("\"").append(dateToJson((Date) obj)).append("\"");
		}
		else if (obj instanceof java.util.Date)
		{
			json.append("\"").append(dateToJson((Date) obj)).append("\"");
		}
		else
		{
			json.append("\"").append(stringToJson(obj.toString())).append("\"");
		}
		return json.toString();
	}

	public static String mapToJson(Map<?, ?> map)
	{
		StringBuilder json = new StringBuilder();
		json.append("{");
		if (map != null && map.size() > 0)
		{
			for (Object key : map.keySet())
			{
				json.append("" + objectToJson(key) + "");
				json.append(":");
				json.append("" + objectToJson(map.get(key)) + "");
				json.append(",");
			}
			json.setCharAt(json.length() - 1, '}');
		}
		else
		{
			json.append("}");
		}
		return json.toString();
	}

	public static String listToJson(List<?> list, String params)
	{
		StringBuffer json = new StringBuffer();
		json.append("[");
		if (list != null && list.size() > 0)
		{
			for (Object obj : list)
			{
				json.append(beanToJson(obj, params));
				json.append(",");
			}
			json.setCharAt(json.length() - 1, ']');
		}
		else
		{
			json.append("]");
		}
		return json.toString();
	}

	public static String listToJson(List<?> list)
	{
		StringBuffer json = new StringBuffer();
		
		if (list != null && list.size() > 0)
		{
			for (Object obj : list)
			{
				json.append(beanToJson(obj));
				json.append(",");
			}
		}
		String str = json.toString();
		return str.substring(0,str.length()-1);
	}

	private static String arrayToJson(Object[] array)
	{
		StringBuilder json = new StringBuilder();
		json.append("{");
		if (array != null && array.length > 0)
		{
			for (Object obj : array)
			{
				json.append(objectToJson(obj));
				json.append(",");
			}
			json.setCharAt(json.length() - 1, ']');
		}
		else
		{
			json.append("}");
		}
		return json.toString();
	}

	public static String dateToJson(Date date)
	{
		return date.toString();
	}

	public static String numberToJson(Number number)
	{
		return number.toString();
	}

	public static String booleanToJson(Boolean bool)
	{
		return bool.toString();
	}

	public static String nullTOJson()
	{
		return "";
	}

	public static String beanToJson(Object obj, String params)
	{
		StringBuffer json = new StringBuffer("{");
		try
		{
			PropertyDescriptor[] pds = PropertyUtils.getPropertyDescriptors(obj);
			if (pds != null && pds.length > 0)
			{
				for (PropertyDescriptor pd : pds)
				{
					String pname = pd.getName();
					if (pname.equals("class"))
						continue;
					if (params.indexOf(pname) == -1)
						continue;
					pname = objectToJson(pname);
					String val = objectToJson(pd.getReadMethod().invoke(obj));
					json.append(pname);
					json.append(":");
					json.append(val);
					json.append(",");
				}
				json.setCharAt(json.length() - 1, '}');
			}
			else
			{
				json.append("}");
			}
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		return json.toString();
	}

	public static String beanToJson(Object obj)
	{
		StringBuffer json = new StringBuffer("{");
		try
		{
			PropertyDescriptor[] pds = PropertyUtils.getPropertyDescriptors(obj);
			if (pds != null && pds.length > 0)
			{
				for (PropertyDescriptor pd : pds)
				{
					if (pd.getName().equals("class"))
						continue;
					String pname = objectToJson(pd.getName());
					String val = objectToJson(pd.getReadMethod().invoke(obj));
					json.append(pname);
					json.append(":");
					json.append(val);
					json.append(",");
				}
				json.setCharAt(json.length() - 1, '}');
			}
			else
			{
				json.append("}");
			}
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		return json.toString();
	}

	public static String stringToJson(String s)
	{
		if (s == null)
		{
			return nullTOJson();
		}
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < s.length(); i++)
		{
			char ch = s.charAt(i);
			switch (ch)
			{
				case '"':
					sb.append("\\\"");
					break;
				case '\\':
					sb.append("\\\\");
					break;
				case '\b':
					sb.append("\\b");
					break;
				case '\f':
					sb.append("\\f");
					break;
				case '\n':
					sb.append("\\n");
					break;
				case '\r':
					sb.append("\\r");
					break;
				case '\t':
					sb.append("\\t");
					break;
				case '/':
					sb.append("\\/");
					break;
				default:
					if (ch >= '\u0000' && ch <= '\u001F')
					{
						String ss = Integer.toHexString(ch);
						sb.append("\\u");
						for (int k = 0; k < 4 - ss.length(); k++)
						{
							sb.append('0');
						}
						sb.append(ss.toUpperCase());
					}
					else
					{
						sb.append(ch);
					}
			}
		}
		return sb.toString();
	}
	
	@SuppressWarnings("unchecked")
	public static Map inintMap()
	{
		Map map = new HashMap();
		for(int i=1;i<=10;i++)
		{
			map.put("num"+i, "");
			map.put("name"+i, "");
			map.put("officeaddr"+i, "");
			map.put("officezipcode"+i, "");
			map.put("phone"+i, "");
			map.put("mobile"+i, "");
			map.put("organheadership"+i, "");
			map.put("officename"+i, "");
			map.put("operator"+i, "");
			map.put("oper_phone"+i, "");
			map.put("opermobile"+i, "");
		}
		return map;
	}
}
